const util = require('../../utils/util.js')
const api = require('../../utils/api')
const layer = require('../../utils/layer');
Component({
    /**
     * 组件的属性列表
     */
    properties: {
        show: {
            type: Boolean,
            value: true
        },
        billId: {
            type: String,
            value: ""
        },
        teamId:{
            type: String,
            value: "0"
        },
    },
    /**
     * 组件的初始数据
     */
    data: {
        buttonList: ["7", "8", "9", "date", "4", "5", "6", "+", "1", "2", "3", "-", ".", "0"],
        inputContent: '0', // 输入的内容
        isFinish: true, // true=> '完成'  false => '='
        remark: '', // 备注
        date: '',// 日期
        name: '',// 表单的名称
        dateStr: '今天', // 日期的显示文本  日期/昨天/今天/明天
        billTypes: [],
        billTypeId: undefined, // 账单类型id
        type: 0, // 0支出 1收入
    },
    // 监听器
    observers: {
        // 监听输入文本改变显示对应的 【完成/=】 文本
        'inputContent': function (inputContent) {
            if (util.isEmpty(inputContent)) {
                return;
            }
            let isFinish = true;
            // 如果输入内容包含 + - 就显示=，否则显示 完成 考虑 '-' 开头的情况
            if (!(inputContent.endsWith('+') || inputContent.endsWith('-'))) {
                let inputContentT = inputContent.substring(1)
                if (inputContent.startsWith("-")) {
                    if (inputContentT.includes("+") || inputContentT.includes("-")) {
                        isFinish = false;
                    }
                } else {
                    if (inputContent.includes("+") || inputContent.includes("-")) {
                        isFinish = false;
                    }
                }
            }
            this.setData({ isFinish })
        },
        /**
         * 如果id改变，监听值
         * @param {*} id 
         */
        'billId': function (id) {
            // 如果有id，则发请求查询账单详情
            if (!util.isEmpty(id) && id!='undefined') {
                wx.showLoading();
                api.get("/bill/detail", { id: id }).then(res => {
                    wx.hideLoading();
                    if (res.data) {
                        this.setData({
                            id: id,
                            name: res.data.name,
                            date: res.data.date,
                            remark: res.data.remark,
                            inputContent: res.data.money+"",
                            billTypeId: res.data.billTypeId,
                            type: res.data.type,
                            dateStr: this.getDateStrByDate(res.data.date),
                        })
                    }
                });
            }
        },
        /**
         * 监听表单的显示和隐藏
         * @param {bool} show 
         */
        'show': function (show) {
            if (show === false) {
                // 清空表单
                this.clearForm();
            }
        }
    },
    /**
     * 生命周期
     * @param {} options 
     */
    attached(options) {
        // 设置日期为当前时间
        let billTypes = [];
        billTypes[0] = util.getBillTypes(0); // 获取支出的账单类型
        billTypes[1] = util.getBillTypes(1); // 获取收入的账单类型
        this.setData({
            date: util.formatDate(new Date()),
            billTypes
        })
    },
    /**
     * 组件的方法列表
     */
    methods: {
        /**
         * 隐藏模态框
         */
        hideModal() {
            this.setData({ show: false })
        },
        /**
         * 点击按键
         */
        buttonTap(e) {
            let value = e.target.dataset.value
            let inputContent = this.data.inputContent
            let inputContentT = inputContent.substring(1) // 去掉 '-'开头的情况
            if (value == "+" || value == "-") {
                // 如果以+-结尾，再输入+-不进行任何操作
                if (inputContent.endsWith("+") || inputContent.endsWith("-")) {
                    return;
                }
                // 不已+-结尾 且去掉-开头，但包含+-则先进行运算
                if (inputContentT.includes("+") || inputContentT.includes("-")) {
                    inputContent = this.calcInputStr(inputContent);
                }
            }
            // 如果inputContent为0 并且输入的不是运算符，则把0清掉
            if (inputContent == '0' && !(value == "+" || value == "-" || value == '.')) {
                inputContent = '';
            }
            inputContent += value;
            this.setData({
                inputContent
            });
        },
        /**
         * isFinish 为ture时是提交，为false时 是加减法运算
         */
        submit() {
            let that = this
            if (this.data.isFinish) {
                // 收入、支出 【去掉末尾的+、-】取绝对值
                if (!this.checkForm()) {
                    return;
                }
                /// 组装表单参数
                let form = {}
                if (!util.isEmpty(that.data.billId)) {
                    form.id = that.data.billId;
                }
                form.type = that.data.type;
                form.billTypeId = that.data.billTypeId;
                form.name = that.data.name;
                form.remark = that.data.remark;
                form.date = that.data.date;
                form.money = that.data.inputContent;
                form.teamId = that.data.teamId;
                /// 处理花销
                if (form.money.endsWith('+') || form.money.endsWith('-')) {
                    /// 去掉末尾的符号
                    form.money = form.money.substring(0, form.money.length - 1)
                }
                /// 取绝对值
                if (form.money.startsWith('-')) {
                    form.money = form.money.substring(1)
                }
                // 团队id
                if (form.teamId == '0') {
                    form.teamId = undefined;
                }
                console.log("保存的表单数据为：");
                console.log(form);
                layer.showLoading("数据保存中...")
                api.post("/bill/save", form).then(res => {
                    wx.hideLoading();
                    // 触发父组件刷新
                    layer.showToast(res.message)
                    this.triggerEvent('reGetPage');
                    that.setData({ show: false })
                })
            } else {
                this.setData({
                    inputContent: this.calcInputStr(this.data.inputContent) + ''
                })
            }
        },
        /**
         * 取消
         */
        cancle() {
            this.setData({
                show: false
            })
        },
        /**
         * 检查表单是否符合要求
         */
        checkForm() {
            let billTypeId = this.data.billTypeId
            let inputContent = this.data.inputContent
            // 必须有类型
            if (util.isEmpty(billTypeId)) {
                layer.showErrorToast("必须选择类型！！")
                return false;
            }
            // 必须输入花费
            if (Number.parseFloat(inputContent) == 0) {
                layer.showErrorToast("必须输入开销！！")
                return false;
            }

            return true;
        },
        /**
         * 加减法运算输入的值
         */
        calcInputStr(inputContent) {
            // 先把之前的数求和或求差，再进行运算
            let numberArry = inputContent.split('+');
            let ans = 0;
            if (numberArry.length < 2) {
                // 说明此时是减法运算，考虑  - 开头的情况
                let isNegativeNumber = false;
                if (inputContent.startsWith('-')) {
                    isNegativeNumber = true;
                    inputContent = inputContent.substring(1);
                }
                console.log(inputContent);
                numberArry = inputContent.split('-');
                if (!isNegativeNumber) {
                    ans = Number.parseFloat(numberArry[0]) - Number.parseFloat(numberArry[1]);
                } else {
                    ans = '-' + (Number.parseFloat(numberArry[0]) + Number.parseFloat(numberArry[1]));
                }
            } else {
                ans = Number.parseFloat(numberArry[0]) + Number.parseFloat(numberArry[1]);
            }
            // 保留四位小数，防止js小数溢出
            ans = Math.floor(ans * 10000) / 10000
            return ans;
        },
        /**
         * 删除操作
         */
        delete() {
            let inputContent = this.data.inputContent
            if (inputContent && inputContent.length > 0) {
                inputContent = inputContent.substring(0, inputContent.length - 1)
            }
            // 默认给0
            if (inputContent.length == 0) {
                inputContent = '0';
            }
            this.setData({
                inputContent
            })
        },
        // 修改日期
        dateChange(e) {
            let value = e.detail.value;
            this.setData({
                date: value,
                dateStr: this.getDateStrByDate(value)
            })
        },
        /**
         * 通过date获取对应的date展示
         * @param {*} date 
         */
        getDateStrByDate(date) {
            let dateStr = date;
            // 判断，日期/今天/明天/昨天
            let nowDateStr = util.formatDate(new Date());
            if (nowDateStr == date) {
                dateStr = '今天'
            }
            // 判断明天、昨天 
            /// 如果年月相同
            if (nowDateStr.substring(0, 8) == dateStr.substring(0, 8)) {
                let nowDay = Number.parseInt(nowDateStr.substring(8, 10))
                let day = Number.parseInt(date.substring(8, 10))
                let distance = nowDay - day;
                if (distance == 1) {
                    dateStr = '昨天'
                }
                if (distance == -1) {
                    dateStr = '明天'
                }
            }
            return dateStr;
        },
        // 类型选择
        tapBillType(e) {
            this.setData({
                billTypeId: e.target.dataset.value,
                name: e.target.dataset.name
            })
        },
        // 支付类型选择
        typeSelect(e) {
            this.setData({
                type: e.target.dataset.type,
            })
        },
        /**
         * 重置表单
         */
        clearForm() {
            let form = {
                inputContent: '0', // 输入的内容
                isFinish: true, // true=> '完成'  false => '='
                remark: '', // 备注
                date: util.formatDate(new Date()),// 日期
                name: '',// 表单的名称
                dateStr: '今天', // 日期的显示文本  日期/昨天/今天/明天
                billTypeId: "", // 账单类型id 默认为第一个
                type: 0, // 0支出 1收入
            }

            this.setData({ ...form })
        }
    }
})
